[트러블 슈팅] 로그인 인증 관련 문제

실행 환경

같은 폴더의 “[리팩터링] 게시판 프로젝트 아키텍처” 노트에 명시된 스택 기준 — Spring Boot 3.3.5, Java 17, H2 Database, Thymeleaf.

문제

로그인을 했을경우, 이미 인증을 받았기에 필터와 인터셉트가 걸러주지 못하는 문제 발견 /members/test -> /members/admin (이동 가능)

문제의 코드

  • session의 null 체크만 하고, 로그인 계정에 대한 인증 로직이 추가되지 않음
    • 위의 문제가 발생한 원인
@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 
        String requestURI = request.getRequestURI();
        Pattern pattern = Pattern.compile("/members/([^/]+)");
        Matcher matcher = pattern.matcher(requestURI);
 
        log.info("인증 체크 인터셉트 실행 {}", requestURI);
        HttpSession session = request.getSession(false);
 
        if(session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
            log.info("미인증 사용자 요청");
 
            response.sendRedirect("/members/login?redirectURI=" + requestURI);
            return false;
        }
        
        return true;
    }

수정된 코드

  • account 계정을 url에서 파싱한 후에, session에 저장되어있는 아이디와 매칭
    • 없으면, /members/login으로 이동
  • 주의할점)
    • url 매칭을 두번째 섹션에 계정명을 사용해야한다
      • ex) memebers/[계정명]
      • 만약에 다른 url로 설정할경우, 인터셉트에 의해서 로그인화면으로 돌아가는 이슈가 존재할 수 있다 (* 이부분은 차후에 생각..)
@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 
        String requestURI = request.getRequestURI();
        Pattern pattern = Pattern.compile("/members/([^/]+)");
        Matcher matcher = pattern.matcher(requestURI);
 
        log.info("인증 체크 인터셉트 실행 {}", requestURI);
        HttpSession session = request.getSession(false);
 
        if(session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
            log.info("미인증 사용자 요청");
 
            response.sendRedirect("/members/login?redirectURI=" + requestURI);
            return false;
            
        }else if(matcher.find()){
            String account = matcher.group(1);
 
            Member authAccount = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER);
 
            if (authAccount.getLoginId() == null ||  !authAccount.getLoginId().equals(account)){
                response.sendRedirect("/members/login?redirectURI="+requestURI);
                log.info("Session loginId: {}, URL account: {}", authAccount.getLoginId(), account);
                return false;
            }
 
        }else{
            response.sendRedirect("/errors/custom/404");
            log.info("Not matcher loginId, Error 404!");
            return false;
        }
 
        return true;
    }

관련 문서